home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_13_09 / barbu2 / modal1.cpp < prev    next >
C/C++ Source or Header  |  1995-05-07  |  5KB  |  209 lines

  1. // MODAL1, MODALDLG's geometry
  2. //////////////////////////////////////////////////////
  3. #include "MODALDLG.HPP"
  4. #include "KW.HPP"
  5.  
  6. const int MODALDLG::DUXMARGIN = 4;
  7. const int MODALDLG::DUYMARGIN = 4;
  8.  
  9. const MODALDLG::DLGHEADER MODALDLG::_DlgHd = {
  10.     DS_SETFONT | DS_MODALFRAME |
  11.         DS_ABSALIGN | WS_SYSMENU,
  12.     0,
  13.     0, 0,
  14.     0, 0,
  15.     '\0',
  16.     '\0',
  17.     '\0',
  18.     8,
  19.     "MS Sans Serif"
  20.     };
  21.  
  22. BOOL MODALDLG::_initGeometry()
  23. {
  24. _template.add((unsigned char*)&_DlgHd,
  25.                 sizeof(_DlgHd));
  26. MULTIPARAM Iter(&_dlgline, KW::G);
  27. _ng = Iter.no();
  28. if(0 == (_pGXY = new GRPXY[_ng ? _ng : 1])){
  29.     _valid = SHOWDATA::MEMORYOUT;
  30.     return FALSE;
  31.     }
  32. for(int i = 0; i < _ng; i++){
  33.     Iter.value(i, _pGXY[i].name);
  34.     _pGXY[i].duwLabel = duwText(_pGXY[i].name, TRUE);
  35.     _pGXY[i].duhLabel = duhPush();
  36.     _pGXY[i].duwAll = _pGXY[i].duwLabel;
  37.     _pGXY[i].duhAll = _pGXY[i].duhLabel + DUYMARGIN;
  38.     _pGXY[i].duwAll = _pGXY[i].duwLabel;
  39.     _pGXY[i].duxNext = DUXMARGIN;
  40.     _pGXY[i].duyNext = _pGXY[i].duhAll;
  41.     }
  42. if(i == 0){    // no defined groups
  43.     _pGXY[i].duwLabel = _pGXY[i].duhLabel = 0;
  44.     _pGXY[i].duwAll = _pGXY[i].duxNext = DUXMARGIN;
  45.     _pGXY[i].duhAll = _pGXY[i].duyNext = DUYMARGIN;
  46.     }
  47. return TRUE;
  48. }
  49.  
  50. void MODALDLG::_addToGroupGeometry(int nGrp,
  51.                         int duW, int duH)
  52. {
  53. _pGXY[nGrp].duwAll = max(_pGXY[nGrp].duwAll,
  54.                             duW+2*DUXMARGIN);
  55. _pGXY[nGrp].duhAll += duH + DUYMARGIN;
  56. _pGXY[nGrp].duyNext += duH + DUYMARGIN;
  57. }
  58.  
  59. int MODALDLG::duwText(const char szText[],
  60.                     BOOL bForButton) const
  61. {
  62. int rough = 4 * strlen(szText);
  63. LOGFONT lFont;
  64.  
  65. HFONT hFont = CreateFont(
  66.             -_DlgHd.wPointSize, 8,
  67.             0, 0,
  68.             700,
  69.             0, 0, 0,
  70.             ANSI_CHARSET, OUT_CHARACTER_PRECIS,
  71.             CLIP_CHARACTER_PRECIS, PROOF_QUALITY,
  72.             VARIABLE_PITCH | FF_SWISS,
  73.             _DlgHd.szFaceName);
  74. if(hFont == NULL)
  75.     return rough;
  76. if(!GetObject(hFont, sizeof(LOGFONT), (LPSTR) &lFont)){
  77.     DeleteObject((HGDIOBJ)hFont);
  78.     return rough;
  79.     }
  80. if(0 == lFont.lfWidth){
  81.     DeleteObject((HGDIOBJ)hFont);
  82.     return rough;
  83.     }
  84. HDC hDC = GetDC(NULL);
  85. HFONT hOld = (HFONT)SelectObject(hDC, (HGDIOBJ)hFont);
  86. RECT r = { 0, 0, 0, 0};
  87. DrawText(hDC, szText, -1, &r, DT_CALCRECT |
  88.         DT_CENTER | DT_SINGLELINE);
  89. DeleteObject(SelectObject(hDC, (HGDIOBJ)hOld));
  90. ReleaseDC(NULL, hDC);
  91. rough = ((r.right - r.left + 1) * 4) / lFont.lfWidth;
  92. rough += (rough % 2);
  93. return bForButton ? rough + 4 : rough;
  94. }
  95.  
  96. int MODALDLG::duhText() const { return 10; }
  97. int MODALDLG::duhEdit() const { return 12; }
  98. int MODALDLG::duhPush() const { return 14; }
  99. int MODALDLG::duSquareBox() const { return 12; }
  100. int MODALDLG::duwScreen() const
  101. { return (GetSystemMetrics(SM_CXSCREEN) * 4L) / 8; }
  102. int MODALDLG::duhScreen() const
  103. { return (GetSystemMetrics(SM_CYSCREEN) * 8L) / 16; }
  104.  
  105. const CTL::DLGITEM MODALDLG::_ItemOk = {
  106.     0, 0,
  107.     0, 0,
  108.     IDOK,
  109.     BS_DEFPUSHBUTTON | WS_TABSTOP |
  110.             WS_VISIBLE | WS_CHILD,
  111.     0x80,
  112.     '\0',
  113.     0
  114.     };
  115.  
  116. const CTL::DLGITEM MODALDLG::_ItemCan = {
  117.     0, 0,
  118.     0, 0,
  119.     IDCANCEL,
  120.     BS_PUSHBUTTON | WS_TABSTOP |
  121.         WS_VISIBLE | WS_CHILD,
  122.     0x80,
  123.     '\0',
  124.     0
  125.     };
  126.  
  127. const CTL::DLGITEM MODALDLG::_ItemGroup = {
  128.     0, 0,
  129.     0, 0,
  130.     0,
  131.     BS_OWNERDRAW | WS_VISIBLE | WS_CHILD,
  132.     0x80,
  133.     '\0',
  134.     0
  135.     };
  136.  
  137. void MODALDLG::_putTabsAndOKCAN()
  138. {
  139. int i, duwDlg, duhDlg, duwGroups;
  140.  
  141. // set final # of items in dialog header:
  142. DLGHEADER *pH = (DLGHEADER*)(_template.get());
  143. pH->dtItemCount = _nCtls + _xOffset - 1;
  144.  
  145. // first adjustment of dialog size:
  146. for(i = duwDlg = duhDlg = 0; i < max(1, _ng); i++){
  147.     duwDlg = max(duwDlg, _pGXY[i].duwAll);
  148.     duhDlg = max(duhDlg, _pGXY[i].duhAll);
  149.     }
  150. for(i = duwGroups = 0; i < _ng; i++)
  151.     duwGroups += _pGXY[i].duwLabel;
  152. duwDlg = max(duwDlg, duwGroups);
  153.  
  154. // prepare copies of OK and CANCEL:
  155. CTL::DLGITEM ok(_ItemOk);
  156. CTL::DLGITEM can(_ItemCan);
  157.  
  158. // OK/CANCEL height and Y pos:
  159. duhDlg += DUYMARGIN;
  160. ok.dtilY = can.dtilY = duhDlg;
  161. ok.dtilCY = can.dtilCY = duhPush();
  162. duhDlg += (2 * duhPush() + DUYMARGIN);
  163.  
  164. // OK/CANCEL width and X pos:
  165. STR oktxt, cantxt;
  166. _dlgline.value(KW::OK, oktxt);
  167. _dlgline.value(KW::CANCEL, cantxt);
  168. int okcanW = max(duwText(oktxt, TRUE),
  169.                 duwText(cantxt, TRUE)) + 24;
  170. ok.dtilCX = can.dtilCX = okcanW;
  171. int duwLeastOkCanLine = 8 * DUXMARGIN + 2 * okcanW;
  172. duwDlg = max(duwDlg, duwLeastOkCanLine);
  173. int nOneFourth = (duwDlg - 2 * okcanW) / 4;
  174. ok.dtilX = nOneFourth;
  175. can.dtilX = 3 * nOneFourth + okcanW;
  176.  
  177. //...and stick both on template:
  178. _template.add((unsigned char*)&ok, sizeof(ok));
  179. _template.add((unsigned char*)&can, sizeof(can));
  180.  
  181. // add dialog tabs
  182. int xG = 0;
  183. for(i = 0; i < _ng; i++){
  184.     CTL::DLGITEM grp(_ItemGroup);
  185.     grp.dtilID = i + 3;
  186.     grp.dtilX = xG;
  187.     grp.dtilY = 0;
  188.     grp.dtilCX = _pGXY[i].duwLabel;
  189.     grp.dtilCY = _pGXY[i].duhLabel;
  190.     xG += grp.dtilCX;
  191.     _template.add((unsigned char*)&grp, sizeof(grp));
  192.     }
  193. if(duwDlg > xG && _ng){ // add dummy to fill tab line
  194.     CTL::DLGITEM grp(_ItemGroup);
  195.     pH->dtItemCount += 1;
  196.     grp.dtilID = -1;
  197.     grp.dtilStyle |= WS_DISABLED;
  198.     grp.dtilX = xG;
  199.     grp.dtilY = 0;
  200.     grp.dtilCX = duwDlg - xG;
  201.     grp.dtilCY = _pGXY[i-1].duhLabel;
  202.     _template.add((unsigned char*)&grp, sizeof(grp));
  203.     }
  204. // final dialog overall dimensions:
  205. pH->dtCX = duwDlg;
  206. pH->dtCY = duhDlg;
  207. }
  208.  
  209.